// 函数定义类型
// 定义函数的参数的类型和函数返回值类型
const sum1 = function (x: number, y: number): number {
	return x + y;
};
// 没有返回值，类型是void
const sum2 = function (x: number, y: number): void {
	console.log(x + y);
};

// 以上只定义函数的类型，并没有定义变量的类型
// 变量的类型是通过类型推论得到的
// 函数的类型：(x: number, y: number) => number
const sum3: (x: number, y: number) => number = function (x, y) {
	return x + y;
};

// 用接口定义函数类型
interface Sum {
	(x: number, y: number): number;
}

const sum4: Sum = function (x, y) {
	return x + y;
};

const sum5: Sum = function (x, y) {
	return x - y;
};
sum5(1, 2);

// 可选参数: 可选参数必须放必选参数的后面
const sum6 = function (x: number, y: number, z?: number): number {
	return x + y;
};

// 参数默认值
const sum7 = function (x: number, y: number, z: number = 1): number {
	return x + y + z;
};
sum7(1, 2);

// 剩下所有参数
const sum8 = function (x: number, ...rest: number[]) {
	console.log(x, rest);
};

// 重载
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string | void {
	if (typeof x === "number") {
		return Number(x.toString().split("").reverse().join(""));
	} else if (typeof x === "string") {
		return x.split("").reverse().join("");
	}
}

let a = reverse(1);
a++;
